﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using Spring.Context.Support;
using Studio7i.CapaDominio;
using Studio7i.CapaNegocio;
using Studio7i.CapaPersistencia;

namespace Studio7i.CapaPruebas.Pruebas_Negocio
{
    [TestFixture]
    public class PruebasAdministracionService
    {
        IApplicationContext Spring = null;
        IAdministracionService Service = null;
        Servicio servCreado = null;
        Administrador admin = null;
        Instrumento instCreado = null;
        Sala SalaCreada = null;
        ArmadoDeSala ArmadoSalaInscrita = null;

        [TestFixtureSetUp]
        public void PrepararPruebasAdminitrador()
        {
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/CapaPersistencia.xml",
                "assembly://Studio7i/Studio7i/CapaNegocio.xml"
                );
            Service = (IAdministracionService)Spring.GetObject("administracionService");
            admin = ((IAdministradorDAO)Spring.GetObject("AdministradorDAO")).Crear(
                new Administrador() { NoAdministrador = "Klay", TxMail = "LARRYTES@gmail.com", FeNacimiento = "12/12/1977", TxtClave = "2323" });

            //Service = (IAdministracionService)Spring.GetObject("administracionService");
            servCreado = ((IServicioDAO)Spring.GetObject("ServicioDAO")).Crear(
               new Servicio() { nombre = "Partituras", costoServicio = 15, descripcion = "Composición de partituras" });

           // Service = (IAdministracionService)Spring.GetObject("administracionService");
            instCreado = ((IInstrumentoDAO)Spring.GetObject("InstrumentoDAO")).Crear(
               new Instrumento() { tipo = "Trombón", marca = "Yamaha", modelo = "F150", anhoDeFabricacion = 2005, caracteristicas = "Trombón super ligero", costoDeAlquiler = 120 });

           // Service = (IAdministracionService)Spring.GetObject("administracionService");
            SalaCreada = ((ISalaDAO)Spring.GetObject("SalaDAO_DAO")).Crear(
                new Sala() { CoSala = 1, Local = new Local() { CoLocal = 1 }, NoSala = "200" });

        }
        [Test]
        public void Test1_IscribirArmadoSala_datosInsuficientes()
        {
            Assert.Catch<DatosInsuficientesException>(
                delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 0); });
        }

        [Test]
        public void servCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                servCreado = Service.RegistrarServicio("Coristas", 360, "Acompañamiento de coristas");
            });
            Assert.IsNotNull(servCreado);
            Assert.Greater(servCreado.codigo, 0);
            Assert.AreEqual(servCreado.nombre, "Coristas");
            Assert.AreEqual(servCreado.costoServicio, 360);
            Assert.AreEqual(servCreado.descripcion, "Acompañamiento de coristas");
        }



        [Test]
        public void instCreadoOK()
        {
            Assert.DoesNotThrow(delegate
            {
                instCreado = Service.RegistrarInstrumento("Teclado", "CASIO", "CS100", 2000, "teclado 2000 teclas", 155);
            });
            Assert.IsNotNull(instCreado);
            Assert.Greater(instCreado.codigo, 0);
            Assert.AreEqual(instCreado.tipo, "Teclado");
            Assert.AreEqual(instCreado.marca, "CASIO");
            Assert.AreEqual(instCreado.modelo, "CS100");
        }

        [Test]
        public void ServicioDescripcionDuplicada()
        {
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarServicio("Aire acondicionado", 200, "Composición de partituras");
            });
        }

        [Test]
        public void InstrumentoDatosIncompletos()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarInstrumento("bateria", "Serendon", "DEll5200", 1998, "doble percusión", 0);
            });

        }

        [Test]
        public void Test1_Crear_DatosInsuficienteAdmin()
        {
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.InscribirAdmin("Petrdo", null, "12/12/1978", null);
            });
        }
        [Test]
        public void Test2_AgregaAdmin_ok()
        {
            Assert.DoesNotThrow(delegate
            {
                Service.InscribirAdmin("Kalos", "Lescano@hotmail.com", "01/03/1989", "oeoeoeo");
            });

            //Assert.IsNotNull(admin);
            //Assert.Greater(admin.CoAdministrador, 0);
            //Assert.AreEqual(admin.NoAdministrador, "Kalos");
            //Assert.AreEqual(admin.TxMail, "klaos@hotmail.com");
            //Assert.AreEqual(admin.FeNacimiento,Convert.ToDateTime("01/03/1989"));
            //Assert.AreEqual(admin.TxtClave, "prueba");
        }
        [Test]
        public void Test2_IscribirArmadoSala_OK()
        {

            Assert.DoesNotThrow(

            delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 1); }
            );

            Assert.IsNull(ArmadoSalaInscrita);

            Assert.Greater(ArmadoSalaInscrita.CoArmado, 0);

            Assert.AreEqual(ArmadoSalaInscrita.SsArmado, 1);

            Assert.AreEqual(ArmadoSalaInscrita.Instrumento.codigo, instCreado.codigo);

            Assert.AreEqual(ArmadoSalaInscrita.Sala.CoSala, SalaCreada.CoSala);

            Assert.AreEqual(ArmadoSalaInscrita.Servicio, servCreado.codigo);

        }
        /*****************************************************************************************/
        [Test]
        public void Test3_IscribirArmadoSala_repetida()
        {

            Assert.Catch<EntidadRepetidaException>(

            delegate { Service.RegistrarArmadoSala(1, 1, 1, 1, 0); });
        }


        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IAdministradorDAO)Spring.GetObject("AdministradorDAO")).Eliminar(admin);
            ((IArmadoDeSalaDAO)Spring.GetObject("ArmadoDeSalaDAO_EF")).Eliminar(ArmadoSalaInscrita);
            ((IInstrumentoDAO)Spring.GetObject("InstrumentoDAO_DAO")).Eliminar(instCreado);
            ((ISalaDAO)Spring.GetObject("SalaDAO_DAO")).Eliminar(SalaCreada);
            ((IServicioDAO)Spring.GetObject("ServicioDAO_DAO")).Eliminar(servCreado);
            Spring.Dispose();
            Spring = null;
        }
        private void XmlApplicationContext(string p, string p_2)
        {

            throw new NotImplementedException();
        }
        public IApplicationContext New { get; set; }

    }
}